package 破坏单例模式以及解决;

import java.io.Serializable;

/**
 *  注意：序列化和反序列化可以破坏单例模式
 */
public class Singleton3  implements Serializable {
    private static boolean flag=false;

    //私有化构造器(也是会跑到这里来的)
    private Singleton3(){
        synchronized (Singleton3.class){
            // 下面方式实现防止通过反射来破坏单例模式。这种目前有安全问题。
            if (flag){
                throw new RuntimeException("不能创建多个对象");
            }
            flag=true;
        }

    }

    //定义为final，防止外部类调用
    private static class SingletonHolder{
        //防止别人修改，我们定义为final
        private static  final Singleton3 INSTANCE=new Singleton3();
    }

    public static Singleton3 getInstance(){
        return SingletonHolder.INSTANCE;
    }

    // 解决序列化反系列化破坏单例模式
    // 在进行反序列化的时候会自动调用此方法，将返回值直接返回
    public Object readResolve(){
        return SingletonHolder.INSTANCE;
    }
}
